desc:DDR Compressor V2.1
// Author Belov Vladimir aka Belovw
// RK Almaty 
// V2.01 2022.04.25
// V2.1  2022.05.16 New Experemntal Modes

slider1:0<-20,20,1>In
slider2:0<-40,0,0.1>Treshold
slider3:4<1,10,0.01>Ratio (10 = Lim)
slider4:3<0,10,1>Knee
slider5:4<0.01,100,0.01>Attack 1
slider6:200<10,1000,0.01>Release 1
 
slider8:0.5<0,1>Style 1<>2
slider9:1000<10,10000>Attack 2
slider10:5000<10,10000>Release 2

slider12:0<-12,12,1>Gain
slider14:mode=0<0,4,1{F||S,F--S,S--F,F-|-S,S-|-F}>Mode

@init
gr_meter=1;
gr_metera=1;
gr_meterl=1;


@slider
T=slider2;
/*
slider3==0 ? r=2;
slider3==1 ? r=4;
slider3==2 ? r=8;
slider3==3 ? r=20;
slider3==4 ? r=10000;
*/
r=slider3;r==10 ? r=10000; 
r2=r^(slider8);
r1=r^((1-slider8));

W=slider4;

aa=exp(-log(9)*1000/srate/slider5);
ar=exp(-log(9)*1000/srate/slider6);

al=exp(-log(9)*1000/srate/slider9); //Attack Long
rl=exp(-log(9)*1000/srate/slider10); //Release Long 

@block


@sample

in=max(abs(spl0),abs(spl1)); // Detecet IN

indb=20*log10(in);
indb+= slider1;
a=indb;

///////////////
// Mode F||S //
///////////////

mode==0 ? (
indb<=(T-w/2) ? insc=indb:
 
indb>=(T+w/2) ? insc=(T+(indb-T)/r1)
 : (

insc=indb+(1/r1-1)*((indb-T+W/2)^2)/2/W
              
)
;

ga=insc-indb;
gl=(indb>T)*(T-indb+(indb-T)/r2);

ga<ga0 ? (ga=aa*ga0 + (1-aa)*ga) : (ga=ar*ga0 + (1-ar)*ga); ga0=ga;
gl<gl0 ? (gl=al*gl0 + (1-al)*gl) : (gl=rl*gl0 + (1-rl)*gl); gl0=gl;
g=ga+gl;

);

///////////////
// Mode F>>S //
///////////////

mode==1 ? (
indb<=(T-w/2) ? insc=indb:
 
indb>=(T+w/2) ? insc=(T+(indb-T)/r1)
 : (

insc=indb+(1/r1-1)*((indb-T+W/2)^2)/2/W
              
)
;

ga=insc-indb;
gl=(insc>T)*(T-insc+(insc-T)/r2);

ga<ga0 ? (ga=aa*ga0 + (1-aa)*ga) : (ga=ar*ga0 + (1-ar)*ga); ga0=ga;
gl<gl0 ? (gl=al*gl0 + (1-al)*gl) : (gl=rl*gl0 + (1-rl)*gl); gl0=gl;
g=ga+gl;

);

///////////////
// Mode S>>F //
///////////////

mode==2 ? (
gl=(indb>T)*(T-indb+(indb-T)/r2);

indb+=gl;

indb<=(T-w/2) ? insc=indb:
 
indb>=(T+w/2) ? insc=(T+(indb-T)/r1)
 : (

insc=indb+(1/r1-1)*((indb-T+W/2)^2)/2/W
              
)
;

ga=insc-indb;

ga<ga0 ? (ga=aa*ga0 + (1-aa)*ga) : (ga=ar*ga0 + (1-ar)*ga); ga0=ga;
gl<gl0 ? (gl=al*gl0 + (1-al)*gl) : (gl=rl*gl0 + (1-rl)*gl); gl0=gl;
g=ga+gl;

);

////////////////
// Mode F-|-S //
////////////////

mode==3 ? (
indb<=(T-w/2) ? insc=indb:
 
indb>=(T+w/2) ? insc=(T+(indb-T)/r1)
 : (

insc=indb+(1/r1-1)*((indb-T+W/2)^2)/2/W
              
)
;

ga=insc-indb;

ga<ga0 ? (ga=aa*ga0 + (1-aa)*ga) : (ga=ar*ga0 + (1-ar)*ga); ga0=ga;

incs=indb+ga;
gl=(insc>T)*(T-insc+(insc-T)/r2);

gl<gl0 ? (gl=al*gl0 + (1-al)*gl) : (gl=rl*gl0 + (1-rl)*gl); gl0=gl;
g=ga+gl;

);

////////////////
// Mode S-|-F //
////////////////

mode==4 ? (
gl=(indb>T)*(T-indb+(indb-T)/r2);
gl<gl0 ? (gl=al*gl0 + (1-al)*gl) : (gl=rl*gl0 + (1-rl)*gl); gl0=gl;

indb+=gl;

indb<=(T-w/2) ? insc=indb:
 
indb>=(T+w/2) ? insc=(T+(indb-T)/r1)
 : (

insc=indb+(1/r1-1)*((indb-T+W/2)^2)/2/W
              
)
;

ga=insc-indb;

ga<ga0 ? (ga=aa*ga0 + (1-aa)*ga) : (ga=ar*ga0 + (1-ar)*ga); ga0=ga;
g=ga+gl;

);

spl0=spl0*10^((slider1+g+slider12)/20);
spl1=spl1*10^((slider1+g+slider12)/20);


@gfx 0 32 // request horizontal/vertical heights (0 means dont care)

  gr_meter=min(10^(g/20),gr_meter);
  gr_meter *= exp(1/60); gr_meter>1 ? gr_meter=1; // decay meter here so if the audio processing stops it doesnt "stick"
  
  gr_metera=min(10^(ga/20),gr_metera);
  gr_metera *= exp(1/60); gr_metera>1 ? gr_metera=1; // decay meter here so if the audio processing stops it doesnt "stick"
  
  gr_meterl=min(10^(gl/20),gr_meterl);
  gr_meterl *= exp(1/60); gr_meterl>1 ? gr_meterl=1; // decay meter here so if the audio processing stops it doesnt "stick"
  
  gfx_r=1; gfx_g=gfx_b=0; gfx_a=0.8;
  
  meter_bot=20;
  meter_h=32; //min(gfx_h,32);
  xscale=gfx_w*20/meter_bot;

  gfx_y=0;
  gfx_x=gfx_w + log10(gr_meter)*xscale;
  gfx_rectto(gfx_w,10);
  
  gfx_y=11;
  gfx_x=gfx_w + log10(gr_metera)*xscale;
  gfx_rectto(gfx_w,21);
  
  gfx_y=22;
  gfx_x=gfx_w + log10(gr_meterl)*xscale;
  gfx_rectto(gfx_w,33);

  gfx_r=gfx_g=gfx_b=1.0; gfx_a=0.6;

  s2=sqrt(2)/2;
  gg = s2;
  while(
    gfx_x=gfx_w + log10(gg)*xscale;
    gfx_x >= 0 ? 
    (
      gfx_y=0;
      gfx_lineto(gfx_x,meter_h,0);
      gfx_y=meter_h-gfx_texth;
      gfx_x+=2;
      gfx_drawnumber(log10(gg)*20,0);
      gfx_drawchar($'d');
      gfx_drawchar($'B');
    );
    gg*=s2;
    gfx_x >=0;
  );
  gfx_a=0.7;

  gfx_x=0; gfx_y=3;//meter_h/2 - gfx_texth/2;
  gfx_drawnumber(log10(gr_meter)*20,1);
  gfx_drawchar($'d');
  gfx_drawchar($'B');
  
  gfx_measurestr("all",x1,y1);
  gfx_x=gfx_w-x1; gfx_y=2;
  gfx_drawstr("all");
  

  gfx_x=gfx_w-8; gfx_y=13;
  gfx_drawchar($'1');
  
  gfx_x=gfx_w-8; gfx_y=24;
  gfx_drawchar($'2');
  

